home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 524 / 524.xpi / chrome / mid.jar / content / mid.js < prev    next >
Text File  |  2010-01-18  |  76KB  |  2,230 lines

  1. ///////////////////////////////////////////////
  2. //              mid.js                       //
  3. /////////////////////////////////////////////// 
  4. //
  5. // More than 500 bugs in less than 150 Kilobyte!
  6. // ---------------------------------------------
  7. // Acknowledgement:
  8. //
  9. // This code contains parts of other extensions such as iconifyTabs, duplicateTab
  10. // Flowing tabs, miniT, and so one. Many thanks for their authors. 
  11. // ---------------------
  12. // All the bugs are mine. 
  13. //////////////////////////////////////////////
  14.  
  15. const Cc = Components.classes;
  16. const Ci = Components.interfaces;
  17. midMyPrefB = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
  18. midMyPrefS = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService);
  19.  
  20. // findService = Cc["@mozilla.org/find/find_service;1"].getService(Ci.nsIFindService);
  21.  
  22.  
  23. var mid_mud =  {
  24.     dictionary : "default",
  25.     olddictionary : "",
  26.     fromDialog : false,
  27.     forwardCounter : 0,
  28.     backCounter : -1,
  29.     saveInHistory : true,
  30.     midRowCounter : -1,
  31.     midFullScreen : false,
  32.     midFromRestore : false,
  33.     homepage : "about:blank",
  34.     midBrowserStartLocation : "http://www.google.com",
  35.     midNS : "http://mid.mozdev.org/dictionaries",
  36.     MAXREOPENFILES : 5,
  37.     FIRSTDYNAMICMENUITEM : 2, 
  38.  
  39.    
  40.     
  41.     Start: function () { 
  42.         
  43.     domHelper = new domHelperObject();
  44.         loadFFsearchEngines();
  45.         this.tabManager.Init();
  46.         this.managePreferences(); 
  47.         this.setBrowserURL();
  48.         this.fileManager.restoreDefaultSet(); 
  49.         
  50.         addEventListener("focus",     this.focusManager.checkFocusedElement, true);
  51.         addEventListener("mousedown", this.focusManager.checkClickedElement, true);
  52.         addEventListener("keypress",  this.focusManager.checkKeypressElement, false);
  53.     },
  54.  
  55.     unload : function () {
  56.         this.saveDSet();
  57.         removeEventListener("focus",     this.checkFocusedElement, true);
  58.         removeEventListener("mousedown", this.checkClickedElement, true);
  59.         removeEventListener("keypress",  this.checkKeypressElement, false);
  60.     },
  61.  
  62.     managePreferences : function () {
  63.  
  64.         /* get rid of old-style preferences */
  65.         if (midMyPrefB.getPrefType("extensions.mid.dtype.en_en") == midMyPrefB.PREF_BOOL) {
  66.             branch = midMyPrefS.getBranch("extensions.mid.dtype.");
  67.             branch.deleteBranch("");
  68.         }
  69.         var i, typ;
  70.         /* First run, set factory default */
  71.         for (i = 0; 
  72.             (typ = document.getElementsByTagNameNS(this.midNS, "default-dict-type").item(i));
  73.             i++) {
  74.             var deftype = typ.getAttribute("label");
  75.             if (midMyPrefB.getPrefType("extensions.mid.dtype." + deftype) != midMyPrefB.PREF_BOOL) {
  76.                 midMyPrefB.setBoolPref("extensions.mid.dtype." + deftype, true);
  77.             }
  78.         }
  79.         /* manage layout */
  80.  
  81.         if (midMyPrefB.getPrefType("extensions.mid.layout.browserup") == midMyPrefB.PREF_BOOL) {
  82.             if (midMyPrefB.getBoolPref("extensions.mid.layout.browserup")) {
  83.                 var t = document.getElementById("mid_tabbox");
  84.                 var s = document.getElementById("mid_BrowserSplitter");
  85.                 var b = document.getElementById("mid_BrowserBox");
  86.                 var p = b.parentNode;
  87.                 p.removeChild(b);
  88.                 p.removeChild(t);
  89.                 p.insertBefore(b, s);
  90.                 p.appendChild(t);
  91.             }
  92.         }
  93.  
  94.         /* get throbber setting */
  95.  
  96.         if (midMyPrefB.getPrefType("extensions.mid.disable.throbber") == midMyPrefB.PREF_BOOL) {
  97.             if (midMyPrefB.getBoolPref("extensions.mid.disable.throbber")) {
  98.                 this.WebProgressListener.throbberDisabled = true;
  99.             }
  100.         }
  101.  
  102.     },
  103.  
  104.      
  105.     removeAllPreferences : function () {
  106.         
  107.         if (!this.util.confirm(this.util.getLocaleString("delete.allpreferences"))) {
  108.             return;
  109.         }
  110.     
  111.         var branch = midMyPrefS.getBranch("extensions.mid.");
  112.         branch.deleteBranch("");
  113.         this.removeDefaultSet();
  114.     
  115.         var popup = document.getElementById("mid_lastusedfilespopup");
  116.         while (popup.childNodes.length > 1) {
  117.             popup.removeChild(popup.lastChild);
  118.         }
  119.     
  120.         this.changeDictionaryName("default");
  121.         this.loadDictionaries();
  122.         this.util.localAlert("revert.to.original.settings","");
  123.     },
  124.  
  125.     
  126.     arrangeLUFPrefs : function (aLUF) {
  127.         
  128.         var conv = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
  129.                        createInstance(Ci.nsIScriptableUnicodeConverter);
  130.         conv.charset = "UTF-8";
  131.         
  132.         var file            = aLUF;
  133.         var midMyPrefs      = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService);
  134.         var savedFilesPrefs = midMyPrefs.getBranch("extensions.mid.lastusedsets.");
  135.         var children        = savedFilesPrefs.getChildList("", {});
  136.         var sortedLUFPrefs  = children.sort(); // 
  137.         var newChildren     = [];
  138.         var usedFile        = ""; 
  139.  
  140.         newChildren.push(file);
  141.     
  142.         for (i = 0; i < children.length; i++) {
  143.             if (savedFilesPrefs.prefHasUserValue(sortedLUFPrefs[i])) {
  144.                 var nFile = savedFilesPrefs.getComplexValue(sortedLUFPrefs[i], Ci.nsILocalFile);
  145.                 if (nFile.path != file.path) {
  146.                     newChildren.push(nFile);
  147.                 }
  148.             }
  149.         }
  150.     
  151.         var limit = Math.min(this.MAXREOPENFILES, newChildren.length);
  152.     
  153.         for (i = 0; i < limit; i++) {
  154.             savedFilesPrefs.setComplexValue(i + 1, Ci.nsILocalFile, newChildren[i]);
  155.         }
  156.     
  157.         // TODO:more testing ...
  158.         for (i = newChildren.length + 1; i < this.MAXREOPENFILES + 1; i++) {
  159.             if (savedFilesPrefs.prefHasUserValue(i)) {
  160.                 savedFilesPrefs.clearUserPref(i);
  161.             }
  162.         }
  163.         
  164.         // try {
  165.         //    usedFile = conv.ConvertToUnicode(savedFilesPrefs.getCharPref("1"));
  166.         // } catch (e) {
  167.         //    usedFile = savedFilesPrefs.getCharPref("1");
  168.         // }
  169.  
  170.         document.getElementById("mid_stat_dictset").value = file.path;
  171.         return true;
  172.     },
  173.     
  174.     reOpen : function () {
  175.     
  176.         var midMyPrefs      = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService);
  177.         var savedFilesPrefs = midMyPrefs.getBranch("extensions.mid.lastusedsets.");
  178.         var children        = savedFilesPrefs.getChildList("", {});
  179.     
  180.         var conv = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
  181.                        createInstance(Ci.nsIScriptableUnicodeConverter);
  182.         conv.charset = "UTF-8";
  183.     
  184.         var menuitem;
  185.         var popup = document.getElementById("mid_lastusedfilespopup");
  186.     
  187.         var popupMenuItems = popup.getElementsByTagName("menuitem");
  188.     
  189.         if ( children.length > 0 && popupMenuItems.length == 1 ) {
  190.             var separator = document.createElement("menuseparator");
  191.              popup.appendChild(separator);
  192.         }
  193.     
  194.         var sortedLUFPrefs=children.sort();
  195.     
  196.         for (i = 0; i < children.length; i++ ){ 
  197.             if ( ! savedFilesPrefs.prefHasUserValue( sortedLUFPrefs[i] ) ) continue;
  198.     
  199.             var file =  savedFilesPrefs.getComplexValue( sortedLUFPrefs[i], Ci.nsILocalFile);
  200.             try {
  201.               var menulabel = conv.ConvertToUnicode(savedFilesPrefs.getCharPref(sortedLUFPrefs[i]));
  202.             } catch (e) { menulabel = savedFilesPrefs.getCharPref(sortedLUFPrefs[i]);
  203.             }
  204.             if (  popupMenuItems.length < this.FIRSTDYNAMICMENUITEM + i ) {   // existing menuitem?
  205.                    menuitem = document.createElement("menuitem");
  206.                    popup.appendChild(menuitem);
  207.             } else {
  208.               menuitem = popupMenuItems.item(i+1); 
  209.             }
  210.             menuitem.setAttribute("label", menulabel );
  211.             menuitem.setAttribute("oncommand", 
  212.             "mid_mud.fileManager.restoreSet(" + (i+1) +',"' + menulabel.replace(/\\/g,'\\\\') + '");');
  213.         }
  214.         return true;
  215.     },
  216.     
  217.     
  218.     removeDefaultSet: function () {
  219.  
  220.         var file = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties)
  221.                  .get("ProfD", Components.interfaces.nsIFile);
  222.         file.append("mid_default.dis");
  223.     
  224.         try {
  225.             if (file.exists()) {
  226.                 file.remove(false);
  227.             }
  228.         } catch (e) {
  229.             if (e.name == "NS_ERROR_FILE_ACCESS_DENIED") {
  230.                 this.util.localAlert("file.access.denied", "");
  231.             }
  232.             else {
  233.                 alert("i/o error: " + e.name + "-" + e.message);
  234.             }
  235.             return false;
  236.         }
  237.     },
  238.  
  239.     changeDictionaryName : function (dName) {
  240.  
  241.         this.dictionary = dName;
  242.         switch (this.dictionary) {
  243.         case "temporary":
  244.             document.getElementById("mid_stat_dictset").value = this.util.getLocaleString("temporary.set");                 
  245.             break;
  246.         case "default": 
  247.             document.getElementById("mid_stat_dictset").value = 
  248.             this.util.getLocaleString("default.set");
  249.             break;
  250.         default: 
  251.             document.getElementById("mid_stat_dictset").value = dName;
  252.         }
  253.     },
  254.    
  255.     setBrowserURL : function () {
  256.         /* Started from a browser */
  257.         if (window.opener && window.opener.content.location.href !== "") {
  258.             midBrowserStartLocation = window.opener.content.location.href; 
  259.             domHelper.browserBrowser.setAttribute("src", midBrowserStartLocation);
  260.             //  domHelper.browserBrowser.markupDocumentViewer.fullZoom = 1.5; //test
  261.             document.getElementById("mid_Url").value = midBrowserStartLocation;
  262.         }
  263.     },
  264.  
  265.     syncBrowserURL : function () {
  266.         const nsIWindowMediator = Components.interfaces.nsIWindowMediator; 
  267.         var windowMediator = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(); 
  268.         windowMediator = windowMediator.QueryInterface(nsIWindowMediator);
  269.         var win = windowMediator.getMostRecentWindow("navigator:browser");
  270.         if ( win && win.gBrowser) {
  271.             domHelper.browserBrowser.setAttribute("src", win.gBrowser.contentWindow.location);
  272.             document.getElementById("mid_Url").value = win.gBrowser.contentWindow.location;
  273.         }
  274.     },
  275.  
  276.     appendToOldDictionaries : function (midlines) {
  277.  
  278.         var mytabpanels = domHelper.tabpanelsElement;
  279.         var nArray = [], dictid, i;
  280.  
  281.         if (this.olddictionary == this.dictionary || this.fromDialog) {
  282.             for (i = 0; (iBrowser = mytabpanels.getElementsByTagName("browser").item(i)); i++) {
  283.                 dictid = iBrowser.xmlDic.getAttribute("dictid");
  284.                 if (this.dictionary === "default") {
  285.                     if (this.checkDictChecked(iBrowser.xmlDic)) { 
  286.                         nArray.push(dictid);
  287.                     }
  288.                 }
  289.                 else {  
  290.                     if (this.util.inArray(midlines, dictid)) {
  291.                         nArray.push(dictid);
  292.                     }
  293.                 }
  294.             }
  295.         }
  296.     
  297.         this.olddictionary = this.dictionary;
  298.  
  299.         if (!midlines) {
  300.             return nArray;
  301.         }
  302.  
  303.         for (i = 0; i < midlines.length; i++) {
  304.             if (this.util.inArray(nArray, midlines[i]) !== true) {
  305.                 nArray.push(midlines[i]);
  306.             }
  307.         }
  308.         return nArray;
  309.     },
  310.  
  311.     
  312.     loadDictionaries : function (midlines) {
  313.     
  314.         var i, xmlDic, dictType, dictChecked, dtchecked, dictId;
  315.         var newDicos = [];
  316.         var ITomb    = [];
  317.         var DTomb    = [];
  318.     
  319.         var tps = domHelper.tabpanelsElement;
  320.         var mytabs = domHelper.tabsElement;
  321.     
  322.         newDicos = this.appendToOldDictionaries(midlines);
  323.         // if (midlines) 
  324.  
  325.         this.tabManager.removeTabs();   
  326.     
  327.         for (i = 0; (xmlDic = document.getElementsByTagNameNS(this.midNS, "dict").item(i)); i++) {
  328.             dictId      = xmlDic.getAttribute("dictid");
  329.             dictType    = xmlDic.getAttribute("type");
  330.         
  331.             if (midlines) {
  332.                 if (newDicos && (newDicos.join().indexOf(dictId) > -1)) { // csunya
  333.                     DTomb.push(newDicos.join().indexOf(dictId) / 37);
  334.                     ITomb[newDicos.join().indexOf(dictId) / 37] = i;
  335.                 }
  336.             }   
  337.             if (!midlines) {
  338.                 if (this.checkDictChecked(xmlDic)) {
  339.                     if (!this.util.inArray(newDicos, dictId)) {
  340.                         newDicos.push(dictId);
  341.                     }
  342.                     DTomb.push(newDicos.join().indexOf(dictId) / 37); // nyilvßn a vΘge
  343.                     ITomb[newDicos.join().indexOf(dictId) / 37] = i;
  344.                 }
  345.             } 
  346.     
  347.         } // for
  348.     
  349.         for (var k in DTomb) {
  350.             if (DTomb.hasOwnProperty(k)) {
  351.                 xmlDic = document.getElementsByTagNameNS(this.midNS, "dict").item(ITomb[k]);
  352.                 if (xmlDic) {
  353.                     this.tabManager.createDictionaryTab(xmlDic);
  354.                 }
  355.             }
  356.         }
  357.     
  358.         DTomb = null;
  359.         ITomb = null;
  360.     
  361.          /* Add progress listeners and find first not collapsed */
  362.     
  363.         var selecteditem = 0; 
  364.         var myBrowser;
  365.     
  366.         for (i = tps.getElementsByTagName("browser").length - 1;
  367.             (myBrowser = tps.getElementsByTagName("browser").item(i));
  368.             i--) {
  369.             myBrowser.docShell.allowJavascript = true;
  370.  
  371.             if (myBrowser.xmlDic.getAttribute("js") == "disabled") { 
  372.                 myBrowser.docShell.allowJavascript = false;
  373.             }
  374.             selecteditem = i;
  375.             try {
  376.                 myBrowser.addProgressListener(this.WebProgressListener,
  377.                                       Ci.nsIWebProgress.NOTIFY_STATE_NETWORK);
  378.             } catch (e) {
  379.                 alert("addProgressListener failed");
  380.             } 
  381.         }
  382.         mytabs.selectedIndex = selecteditem;
  383.         
  384.         this.fromDialog = false; 
  385.     },
  386.  
  387.     checkDictChecked : function (xmlDic) {
  388.     
  389.         var dictChecked = false;
  390.         var typeChecked = false;
  391.     
  392.         var dictType    = xmlDic.getAttribute("type");
  393.         var dictId      = xmlDic.getAttribute("dictid");
  394.     
  395.         if (midMyPrefB.getPrefType("extensions.mid.dtype." + dictType) == midMyPrefB.PREF_BOOL) {
  396.             typeChecked = midMyPrefB.getBoolPref("extensions.mid.dtype." + dictType);
  397.         } 
  398.         else {
  399.             return false;
  400.         }
  401.         if (!typeChecked) { 
  402.             return false;
  403.         }
  404.     
  405.         if (midMyPrefB.getPrefType("extensions.mid." + dictId + "_checked") == midMyPrefB.PREF_BOOL) {
  406.             dictChecked = midMyPrefB.getBoolPref("extensions.mid." + dictId + "_checked");
  407.         } else {
  408.             xmlDic.getAttribute("checked") == "true" ? dictChecked = true : dictChecked = false; 
  409.         }
  410.     
  411.         if (!dictChecked) {
  412.             return false;
  413.         }
  414.     
  415.         return true;
  416.     },
  417.  
  418.     
  419.     getDictionaryPreferences : function () {
  420.     
  421.         var midDictArg = {}, midlines = [] ;
  422.     
  423.         this.saveDSet();
  424.     
  425.         if (this.dictionary === "new") {
  426.             this.tabManager.removeTabs();   
  427.         }
  428.     
  429.         midDictArg.dictionary = this.dictionary;
  430.         this.olddictionary = this.dictionary;
  431.         this.fromDialog = true;
  432.         openDialog("choose_dict.xul", "pref",
  433.                    "modal=1,dialog=1,chrome=1,centerscreen=1,resizable=0", midDictArg);
  434.  
  435.         if (midDictArg.dictionary == "cancelled" ) {
  436.             this.dictionary="cancelled";
  437.             mid_mud.fileManager.restoreDefaultSet(); 
  438.          return;    
  439.     };
  440.  
  441.         if (midDictArg.dictionary === "new" || midDictArg.dictionary === "saveas") {
  442.             mid_mud.fileManager.saveSetAs(); // changes dictionary name
  443.             if (this.dictionary === "new" || this.dictionary === "") {    
  444.                 this.changeDictionaryName("temporary");
  445.             }
  446.             else {
  447.                 this.saveDSet();
  448.             }
  449.         } 
  450.         else {
  451.             this.changeDictionaryName(midDictArg.dictionary);
  452.         }
  453.     
  454.         if (midDictArg.mylines) {
  455.             midlines = midDictArg.mylines;
  456.             this.loadDictionaries(midlines);
  457.         } else {
  458.             if (midDictArg.result) {
  459.                 this.loadDictionaries();
  460.             }
  461.         }
  462.         this.fromDialog = false;
  463.     }, 
  464.  
  465.     newDictionarySet : function () {
  466.         this.saveDSet();
  467.         this.dictionary = "new";
  468.         this.getDictionaryPreferences();
  469.  
  470.     },
  471.  
  472.     saveDSet : function () {
  473.         //  if (!this.util.confirm(this.util.getLocaleString("dictionaryset.save.changes"))) return;
  474.         if ((this.dictionary === "temporary") || (this.dictionary === "new")) {
  475.             return;
  476.         }
  477.     
  478.         if (this.dictionary === "default") {
  479.             this.fileManager.saveDefaultSet();
  480.             return;
  481.         }
  482.         this.fileManager.saveNamedSet();
  483.     },
  484.  
  485.     updateStatusBarCounter : function () {
  486.        document.getElementById("mid_stat_counter").value=mid_mud.transMemory.getRowCount();
  487.     }
  488.  
  489. };
  490.  
  491. // members //
  492.  
  493. mid_mud.WebProgressListener = {
  494.  
  495.     progresscounter : 0,
  496.     throbberDisabled : false,
  497.  
  498.     QueryInterface: function (iid) {
  499.         if (iid.equals(Ci.nsIWebProgressListener) ||
  500.             iid.equals(Ci.nsISupportsWeakReference) ||
  501.             iid.equals(Ci.nsISupports)) {
  502.             return this;
  503.         }
  504.         throw Components.results.NS_ERROR_NO_INTERFACE;
  505.     },
  506.  
  507.     onProgressChange : function (wp, req, cur, max, curtotal, maxtotal) {},
  508.  
  509.     onStateChange : function (wp, req, state, status) {
  510.         if ((state & Ci.nsIWebProgressListener.STATE_STOP) && 
  511.            (state & Ci.nsIWebProgressListener.STATE_IS_NETWORK)) {
  512.             if (this.progresscounter > 0) { 
  513.                 this.progresscounter = this.progresscounter - 1;
  514.             }
  515.             if (this.progresscounter === 0) {
  516.                 document.getElementById("mid_stoploadbutton").disabled = true;
  517.             }
  518.             if (!this.throbberDisabled) { 
  519.                 setTimeout(window.mid_mud.tabManager.setThrobber, 0, wp.DOMWindow, false); 
  520.             }
  521.         } 
  522.         if ((state & Ci.nsIWebProgressListener.STATE_START) && 
  523.             (state & Ci.nsIWebProgressListener.STATE_IS_NETWORK)) {
  524.             document.getElementById("mid_stoploadbutton").disabled = false;
  525.             this.progresscounter = this.progresscounter + 1;
  526.  
  527.             if (!this.throbberDisabled) {
  528.                 setTimeout(window.mid_mud.tabManager.setThrobber, 0, wp.DOMWindow, true);
  529.             }
  530.         }
  531.         if ((state & Ci.nsIWebProgressListener.STATE_TRANSFERRING)) {
  532.             if (!this.throbberDisabled) {
  533.                 setTimeout(window.mid_mud.tabManager.setThrobber, 0, wp.DOMWindow, false);
  534.             }
  535.         }
  536.     },
  537.     onLocationChange : function (wp, req, loc) {},
  538.     onStatusChange : function (wp, req, status, message) {},
  539.     onSecurityChange : function (wp, req, state) {}
  540. };
  541.  
  542.  
  543.  
  544. mid_mud.focusManager = {
  545.  
  546.     preventFocusReset : false,
  547.     lastfocused : "micimacko",
  548.  
  549.     focusSearchField : function () {
  550.     domHelper.inputElement.focus();
  551.         domHelper.f2.setAttribute("class", "midf2hidden");
  552.         this.preventFocusReset = false;
  553.     },
  554.  
  555.     checkFocusedElement :  function (event) {
  556.         if (window.fullScreen) {
  557.             this.preventFocusReset = true; 
  558.             return;
  559.         } // there is no input field
  560.     
  561.         cmdDispatcher = document.commandDispatcher;
  562.     
  563.         if (event.target.id == "mid_searchWord") {
  564.             domHelper.f2.setAttribute("class", "midf2hidden");
  565.         }
  566.     
  567.         if (this.preventFocusReset) {
  568.             return;
  569.         }
  570.     
  571.         if (event.target && event.target.id == "mid_Url") {
  572.             this.preventFocusReset = true;
  573.         }
  574.     
  575.         if (cmdDispatcher.focusedElement) {
  576.             if (cmdDispatcher.focusedElement.tagName) {
  577.                 if (cmdDispatcher.focusedElement.id == "mid_searchWord") {
  578.                     domHelper.f2.setAttribute("class", "midf2hidden");
  579.                 }
  580.                 if (cmdDispatcher.focusedElement.tagName != this.lastfocused) {
  581.                     this.lastfocused = cmdDispatcher.focusedElement.tagName;
  582.                     setTimeout(window.mid_mud.focusManager.focusSearchField, 20);
  583.                 }
  584.             } else { 
  585.                 setTimeout(window.mid_mud.focusManager.focusSearchField, 20);
  586.             }
  587.         } else {
  588.             setTimeout(window.mid_mud.focusManager.focusSearchField, 20);
  589.         }
  590.     
  591.     },
  592.     
  593.     checkClickedElement : function (event) {
  594.         this.preventFocusReset = true;
  595.     },
  596.  
  597.     checkKeypressElement : function (event) {
  598.  
  599.         this.preventFocusReset = true;
  600.  
  601.         if (event.altKey) {
  602.            return;
  603.     }
  604.  
  605.         if (event.originalTarget.tagName) {
  606.             if (event.originalTarget.id == "mid_searchWord") {
  607.                 this.preventFocusReset = false;
  608.             }
  609.             if (event.originalTarget.tagName == "HTML") {
  610.                 this.preventFocusReset = true;
  611.             }
  612.         } else {
  613.             this.preventFocusReset = false;
  614.         }
  615.   
  616.         // alert (event.keyCode);
  617.         if (event.keyCode == 9) {
  618.             this.preventFocusReset = true;
  619.         }
  620.     }
  621. };
  622.  
  623.  
  624.  
  625. function domHelperObject() {
  626.     this.tabpanelsElement = document.getElementById("mid_tabpanels");
  627.     this.tabsElement      = document.getElementById("mid_tabs");
  628.     this.tabboxElement    = document.getElementById("mid_tabbox");
  629.     this.inputElement     = document.getElementById("mid_searchWord");
  630.     this.f2               = document.getElementById("mid_focusLabel");
  631.     this.browserBrowser   = document.getElementById("mid_MainBrowser");
  632.     this.mainMenubar      = document.getElementById("mid_menubar");
  633.     this.mainStatusbar    = document.getElementById("mid_statusbar");
  634.     this.browserSplitter  = document.getElementById("mid_BrowserSplitter");
  635.     this.browserBox       = document.getElementById("mid_BrowserBox");
  636.     this.wordsTree        = document.getElementById("mid_wordstree");
  637.     this.url              = document.getElementById("mid_Url");
  638.     this.sideBar          = document.getElementById("mid_sidebar");
  639. };   
  640.  
  641.  
  642. mid_mud.tabManager = {
  643.     
  644.     tabIconic : "false" ,
  645.  
  646.     Init : function () {
  647.         this.tabPanelsElement = document.getElementById("mid_tabpanels");
  648.         this.tabsElement      = document.getElementById("mid_tabs");
  649.         this.tabIconic        = this.tabsElement.getAttribute("iconic"); 
  650.     },
  651.  
  652.     createDictionaryTab : function (xmlDic) {
  653.     
  654.         var   newTab, newBrowser;
  655.         newTab = document.createElement("tab");
  656.  
  657.         mid_mud.util.populateWithAttributes(newTab,
  658.             "id",          "tab" + xmlDic.getAttribute("dictid"),
  659.             "context",     "mid_tabcontextpopup",
  660.             "label",       xmlDic.getAttribute("label"),
  661.             "image",       xmlDic.getAttribute("fav"),
  662.             "tooltiptext", xmlDic.getAttribute("label") + " : " + xmlDic.getAttribute("home"),
  663.             "dicthome",    xmlDic.getAttribute("home"),
  664.             "iconic",      this.tabIconic); 
  665.     
  666.         this.tabsElement.appendChild(newTab);
  667.     
  668.         newBrowser    = document.createElement("browser");
  669.         newBrowser.xmlDic = xmlDic;
  670.         mid_mud.util.populateWithAttributes(newBrowser,
  671.             "id",          "b" +  xmlDic.getAttribute("dictid"),
  672.             "type",        "content-primary",
  673.             "context",     "mid_browsercontextpopup",
  674.             "src",         xmlDic.getAttribute("home"),
  675.             "homepage",    xmlDic.getAttribute("home"),
  676.             "ondblclick", "mid_mud.lookup.lookupFromContext()");
  677.     
  678.         this.tabPanelsElement.appendChild(newBrowser);
  679.     }, 
  680.     
  681.     styleTabs : function (event) {
  682.  
  683.         var curtab, curpanel, i 
  684.     
  685.         if (event) {
  686.             var cButton = event.originalTarget;
  687.             if (cButton.localName != "toolbarbutton") {
  688.                 return; // elsewere on tabs
  689.             }
  690.         }
  691.     
  692.         for (i = 0; (curtab = this.tabsElement.getElementsByTagName("tab").item(i)); i++) {
  693.             curpanel = document.getElementById(curtab.linkedpanel);
  694.             if (this.tabIconic == "true" ) {
  695.                 curtab.setAttribute("iconic", "false");
  696.             }
  697.             else  {
  698.                 curtab.setAttribute("iconic", "true");
  699.             }
  700.         }
  701.     
  702.         if (cButton) {
  703.             if (this.tabIconic == "true" ) { 
  704.                 cButton.setAttribute("iconic", "false");
  705.                 this.tabIconic = "false"
  706.             }
  707.             else {
  708.                 cButton.setAttribute("iconic", "true");
  709.                 this.tabIconic = "true"
  710.             }
  711.         }
  712.         domHelper.tabsElement.setAttribute("iconic",this.tabIconic);
  713.     },
  714.     
  715.     removeTabs : function () {
  716.  
  717.         while (this.tabPanelsElement.hasChildNodes()) {
  718.             try {
  719.                 this.tabPanelsElement.firstChild.removeProgressListener(mid_mud.WebProgressListener);
  720.             } 
  721.             catch (e) {
  722.                 alert("removeProgressListener failed");
  723.             } 
  724.             this.tabPanelsElement.removeChild(this.tabPanelsElement.firstChild);
  725.         }
  726.     
  727.         while (this.tabsElement.hasChildNodes()) {
  728.             this.tabsElement.removeChild(this.tabsElement.firstChild);
  729.         }
  730.     },
  731.         
  732.     setThrobber : function (dm, image) {
  733.  
  734.         var doc = dm;
  735.         if (!doc) {          // ff2
  736.             return;
  737.     }
  738.         var tabsArray      = domHelper.tabsElement.getElementsByTagName("tab");
  739.         var tabPanelsArray = domHelper.tabpanelsElement; // this.tabPanelsElement;
  740.  
  741.         var i, iBrowser, iTab;
  742.         for (i = 0;(iBrowser = tabPanelsArray.getElementsByTagName("browser").item(i)); i++) {
  743.             iTab = tabsArray.item(i);
  744.             if (iBrowser.currentURI && iBrowser.currentURI.spec == doc.document.location.href) {
  745.                 if (image) {
  746.                     iTab.setAttribute("busy", "true");
  747.                     iTab.removeAttribute("image");
  748.                 }
  749.                 else {
  750.                     if (iTab.hasAttribute("busy")) {
  751.                         iTab.removeAttribute("busy");
  752.                         iTab.setAttribute("image", iBrowser.xmlDic.getAttribute("fav"));
  753.                     }
  754.                 }
  755.             }
  756.         }
  757.     
  758.     },
  759.  
  760.     closeTab : function () {
  761.     
  762.         var dictTabId     = document.popupNode.id;
  763.         var dictBrowserId = dictTabId.replace("tab", "b");
  764.     
  765.         var dictTabToRemove     = document.getElementById(dictTabId);
  766.         var dictBrowserToRemove = document.getElementById(dictBrowserId);
  767.     
  768.         if (dictTabToRemove.getAttribute("selected", "true")) {
  769.             this.tabsElement.advanceSelectedTab(1, true);
  770.         }
  771.     
  772.         try {
  773.             dictBrowserToRemove.removeProgressListener(mid_mud.WebProgressListener);
  774.         }
  775.         catch (e) {}
  776.     
  777.         this.tabPanelsElement.removeChild(dictBrowserToRemove);
  778.         this.tabsElement.removeChild(dictTabToRemove);
  779.     
  780.         this.tabPanelsElement.selectedIndex = this.tabsElement.selectedIndex; //??
  781.         var dictId = dictTabId.replace("tab", "");
  782.         midMyPrefB.setBoolPref("extensions.mid." + dictId + "_checked", false);
  783.     
  784.     },
  785.  
  786.     openHomePage : function () {
  787.         var dictTab = document.getElementById(document.popupNode.id);
  788.         window.open(dictTab.getAttribute("dicthome"));
  789.     },
  790.  
  791.     dictTabPopupShowing :  function () {
  792.         // nothing to do as for now 
  793.         // alert(document.popupNode.id);
  794.     },
  795.  
  796.     dragAndDrop : {
  797.         onDragStart: function (event, transferData, action) {
  798.             var tabArray = domHelper.tabsElement.getElementsByTagName("tab");
  799.             var myIndex = -1;
  800.             for (var i = 0; i < tabArray.length; i++) {
  801.                 if (event.target.id == tabArray[i].id) {
  802.                     myIndex = i;
  803.                 }
  804.             }
  805.             mid_mud.util.dumpToConsole(myIndex);
  806.             if (myIndex == -1) {
  807.                 return;
  808.             }
  809.             this.index = myIndex;
  810.             transferData.data = new TransferData();
  811.             transferData.data.addDataForFlavour("text/x-mid-tab", 'nyul');
  812.         },
  813.             
  814.         getSupportedFlavours : function () {
  815.             var flavours = new FlavourSet();
  816.             flavours.appendFlavour("text/x-mid-tab");
  817.             return flavours;
  818.         },
  819.     
  820.         onDragOver : function(event,flavour,session) {
  821.             return true; 
  822.         },
  823.     
  824.         onDragEnter : function(event, session) {
  825.         },
  826.     
  827.         onDragExit : function(event, session) {
  828.         },
  829.     
  830.         canDrop: function(event, session) { 
  831.             if (session.sourceNode &&
  832.                  session.sourceNode.parentNode == document.getElementById("mid_tabs") &&
  833.                  ((event.screenX >= session.sourceNode.boxObject.screenX &&
  834.                  event.screenX <= (session.sourceNode.boxObject.screenX +
  835.                  session.sourceNode.boxObject.width)) &&
  836.                  (event.screenY >= session.sourceNode.boxObject.screenY &&
  837.                  event.screenY <= (session.sourceNode.boxObject.screenY +
  838.                  session.sourceNode.boxObject.height)))
  839.                  )
  840.             return false;
  841.             return true;
  842.         },
  843.             
  844.         onDrop: function (event, dropData, session) {
  845.             var newIndex=this.getNewIndex(event);
  846.             if (newIndex != this.index ) {
  847.                 this.moveTabTo(newIndex, session);
  848.             }
  849.         },
  850.     
  851.         moveTabTo: function (newIndex, session) {
  852.             var tabs      = domHelper.tabsElement;
  853.             var tabpanels = domHelper.tabpanelsElement;
  854.             var draggedBrowser = tabpanels.getElementsByTagName("browser").item(this.index);
  855.             var sh = draggedBrowser.sessionHistory;
  856.             var originalHistory = this.copyTabHistory(sh);
  857.             try {
  858.                 draggedBrowser.removeProgressListener(mid_mud.WebProgressListener);
  859.             } catch (e) {} 
  860.             tabs.insertBefore(session.sourceNode, tabs.getElementsByTagName("tab").item(newIndex));
  861.             tabpanels.insertBefore(draggedBrowser, tabpanels.getElementsByTagName("browser").item(newIndex));
  862.             tabs.selectedItem = session.sourceNode;
  863.             tabpanels.selectedPanel = draggedBrowser;
  864.             draggedBrowser.addProgressListener(mid_mud.WebProgressListener,
  865.                                                Ci.nsIWebProgress.NOTIFY_STATE_NETWORK);
  866.             this.restoreDraggedHistory(draggedBrowser.webNavigation, originalHistory);
  867.     
  868.         },
  869.     
  870.         getNewIndex: function (event) {
  871.             var tabArray = document.getElementById("mid_tabs").getElementsByTagName('tab');
  872.     
  873.             for (var i = 0; i < tabArray.length; i++)
  874.                 if (event.clientX < tabArray[i].boxObject.x + tabArray[i].boxObject.width / 2) 
  875.                     if (event.clientY < tabArray[i].boxObject.y + tabArray[i].boxObject.height)
  876.                         return i;
  877.     
  878.             return tabArray.length;
  879.         },
  880.      
  881.         copyTabHistory: function (originalHistory) {
  882.             var range = {start : 0, length : originalHistory.count};
  883.     
  884.             var copiedHistory = [];
  885.             for (var i = range.start; i < range.length; i++) {
  886.                 copiedHistory.push(originalHistory.getEntryAtIndex(i, false));
  887.             }
  888.             copiedHistory.index = originalHistory.index;
  889.     
  890.             return copiedHistory;
  891.         },
  892.     
  893.         restoreDraggedHistory: function(webNav, originalHistory) {
  894.     
  895.             var newHistory = webNav.sessionHistory;
  896.     
  897.             newHistory.QueryInterface(Components.interfaces.nsISHistoryInternal);
  898.     
  899.             // delete history entries if they are present
  900.             
  901.             if (newHistory.count > 0)
  902.                 newHistory.PurgeHistory(newHistory.count);
  903.     
  904.             for (var i = 0; i < originalHistory.length; i++) {
  905.                 var entry = originalHistory[i].QueryInterface(Components.interfaces.nsISHEntry);
  906.                 var newEntry = this.restoreHistoryEntry(entry);
  907.                 if (newEntry)
  908.                     newHistory.addEntry(newEntry, true);
  909.             }
  910.     
  911.             // Go to current history location
  912.             if (originalHistory.index < originalHistory.length)
  913.                 gotoHistoryIndex(10);
  914.     
  915.             function gotoHistoryIndex(attempts) {
  916.                 try {
  917.                     webNav.gotoIndex(originalHistory.index);
  918.                 }
  919.                 catch(e) {
  920.                     // do some math to increase the timeout
  921.                     // each time we try to update the history index
  922.                     if (attempts)
  923.                         setTimeout(gotoHistoryIndex, (11 - attempts) * (15 - attempts), --attempts);
  924.                 }
  925.             }
  926.         },
  927.     
  928.         restoreDraggedHistory: function (webNav, originalHistory) {
  929.             function gotoHistoryIndex(attempts) {
  930.                 try {
  931.                     webNav.gotoIndex(originalHistory.index);
  932.                 }
  933.                 catch (e) {
  934.                     // do some math to increase the timeout
  935.                     // each time we try to update the history index
  936.                     if (attempts) {
  937.                         setTimeout(gotoHistoryIndex, (11 - attempts) * (15 - attempts), --attempts);
  938.                     }
  939.                 }
  940.             }
  941.     
  942.             var newHistory = webNav.sessionHistory;
  943.     
  944.             newHistory.QueryInterface(Components.interfaces.nsISHistoryInternal);
  945.     
  946.             // delete history entries if they are present
  947.     
  948.             if (newHistory.count > 0) {
  949.                 newHistory.PurgeHistory(newHistory.count);
  950.             }
  951.             for (var i = 0; i < originalHistory.length; i++) {
  952.                 var entry = originalHistory[i].QueryInterface(Components.interfaces.nsISHEntry);
  953.                 var newEntry = this.restoreHistoryEntry(entry);
  954.                 if (newEntry) {
  955.                     newHistory.addEntry(newEntry, true);
  956.                 }
  957.             }
  958.     
  959.             // Go to current history location
  960.             if (originalHistory.index < originalHistory.length) {
  961.                 gotoHistoryIndex(10);
  962.             }
  963.         },
  964.     
  965.         restoreHistoryEntry: function (aEntry) {
  966.             if (!aEntry) {
  967.                 return null;
  968.             }
  969.             aEntry = aEntry.QueryInterface(Components.interfaces.nsISHContainer);
  970.             var newEntry = aEntry.clone();
  971.             newEntry = newEntry.QueryInterface(Components.interfaces.nsISHContainer);
  972.             newEntry.loadType = Math.floor(aEntry.loadType);
  973.             if (aEntry.childCount) {
  974.                 for (var j = 0; j < aEntry.childCount; j++) {
  975.                     var childEntry = this.restoreHistoryEntry(aEntry.GetChildAt(j));
  976.                     if (childEntry) {
  977.                         newEntry.AddChild(childEntry, j);
  978.                     }
  979.                 }
  980.             }
  981.             return newEntry;
  982.         } 
  983.     
  984.     }
  985.       
  986. };
  987.  
  988.  
  989.  
  990.  
  991. mid_mud.layoutManager = {
  992.     
  993.     fullScreen : function () {
  994.     
  995.         var midmyelement, i;
  996.         window.fullScreen = !window.fullScreen;
  997.         document.getElementById("mid_viewFullScreen").setAttribute("checked", window.fullScreen);
  998.     
  999.         for (i = 0; (midmyelement = document.getElementsByTagName("toolbar").item(i)); i++) {
  1000.             midmyelement.setAttribute("collapsed", window.fullScreen);
  1001.         }
  1002.     
  1003.         for (i = 0; (midmyelement = document.getElementsByTagName("statusbar").item(i)); i++) {
  1004.             midmyelement.setAttribute("collapsed", window.fullScreen);
  1005.         }
  1006.     
  1007.         for (i = 0; (midmyelement = document.getElementsByTagName("menubar").item(i)); i++) {
  1008.             midmyelement.setAttribute("collapsed", window.fullScreen);
  1009.         } 
  1010.        
  1011.     },
  1012.     
  1013.     browserView : function  () { 
  1014.         var browserSplitter = document.getElementById("mid_BrowserSplitter"); 
  1015.         var browser = document.getElementById("mid_BrowserBox"); 
  1016.         if (browser.getAttribute("collapsed") == "true") { 
  1017.             document.getElementById("mid_viewpopupbrowseritem").setAttribute("checked", "true"); 
  1018.             browser.setAttribute("collapsed", "false"); 
  1019.             browserSplitter.setAttribute("collapsed", "false"); 
  1020.         } else { 
  1021.             document.getElementById("mid_viewpopupbrowseritem").setAttribute("checked", "false"); 
  1022.             browser.setAttribute("collapsed", "true"); 
  1023.             browserSplitter.setAttribute("collapsed", "true"); 
  1024.         }
  1025.     },
  1026.         
  1027.     histView: function () {
  1028.         var wordsTree = document.getElementById("mid_wordstree");
  1029.         if (wordsTree.getAttribute("collapsed") == "true") {
  1030.             document.getElementById("mid_viewpopuphistitem").setAttribute("checked", "true");
  1031.             wordsTree.setAttribute("collapsed", "false");
  1032.         } else {
  1033.             document.getElementById("mid_viewpopuphistitem").setAttribute("checked", "false");
  1034.             wordsTree.setAttribute("collapsed", "true");
  1035.         }
  1036.         this.checkSideBar();
  1037.     },
  1038.  
  1039.     checkSideBar: function () {
  1040.         
  1041.         var s = domHelper.sideBar;
  1042.         var sc = true;
  1043.         for (var i = 0; i < s.childNodes.length; i++) { 
  1044.              if ( s.childNodes[i].collapsed == false) {
  1045.                  sc = false;
  1046.                  break;
  1047.              }
  1048.          }
  1049.          s.collapsed = sc;
  1050.     }, 
  1051.  
  1052.      
  1053.     statusbarView: function () {
  1054.         var statusbar = document.getElementById("mid_statusbar");
  1055.         if (statusbar.getAttribute("collapsed") == "true") {
  1056.             document.getElementById("mid_viewpopupstatusbaritem").setAttribute("checked", "true");
  1057.             statusbar.setAttribute("collapsed", "false");
  1058.         } else {
  1059.             document.getElementById("mid_viewpopupstatusbaritem").setAttribute("checked", "false");
  1060.             statusbar.setAttribute("collapsed", "true");
  1061.         }
  1062.     }
  1063.             
  1064.  
  1065. };
  1066.  
  1067.  
  1068. mid_mud.helpMenu = {
  1069.  
  1070.     showAllDictionaries : function () {
  1071.     
  1072.         var myff = Cc["@mozilla.org/file/directory_service;1"]
  1073.             .getService(Ci.nsIProperties)
  1074.             .get("ProfD", Ci.nsIFile);
  1075.     
  1076.         var ios = Cc["@mozilla.org/network/io-service;1"]
  1077.             .getService(Ci.nsIIOService);
  1078.     
  1079.         var fileHandler = ios.getProtocolHandler("file")
  1080.             .QueryInterface(Ci.nsIFileProtocolHandler);
  1081.     
  1082.         var URL = fileHandler.getURLSpecFromFile(myff);
  1083.         var fURL = "jar:" + URL +
  1084.             "/extensions/{9ef1e09b-d4b2-4a55-ac3e-1cb330546bec}" +
  1085.             "/chrome/mid.jar!/content/dictionaries.xml";
  1086.         var mURL = "jar:" + URL + "/chrome/mid.jar!/content/dictionaries.xml";
  1087.     
  1088.         var showDicos = {
  1089.     
  1090.             Firefox   : function () { window.open(fURL); },
  1091.             Iceweasel : function () { window.open(fURL); },
  1092.             Flock     : function () { window.open(fURL); },
  1093.             Netscape  : function () { window.open(fURL); },
  1094.             SeaMonkey : function () { window.open(fURL); },
  1095.             mid       : function () {
  1096.                 var myff = Cc["@mozilla.org/file/directory_service;1"]
  1097.                     .getService(Ci.nsIProperties)
  1098.                     .get("resource:app", Ci.nsIFile);
  1099.                 var URL  = fileHandler.getURLSpecFromFile(myff);
  1100.                 var xURL = URL + "chrome/content/mid/dictionaries.xml";
  1101.                 window.open(xURL);
  1102.                }
  1103.         };
  1104.     
  1105.         mid_mud.util.browserWrapper(showDicos);
  1106.     
  1107.     },
  1108.  
  1109.     aboutBox : function () {
  1110.         openDialog("about.xul", "About mid",
  1111.         "chrome,resizeable,centerscreen,dialog,min-width=350px");
  1112.     },
  1113.  
  1114.     showHomePage : function () {
  1115.         window.open("http://mid.mozdev.org");
  1116.     }
  1117.     
  1118. };
  1119.  
  1120.  
  1121. mid_mud.fileManager = {
  1122.  
  1123.     fileWriter : function (file) {
  1124.     
  1125.         var fileStream =
  1126.         Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
  1127.        
  1128.         try {   
  1129.             fileStream.init(file, 0x04 | 0x08 | 0x20, 420, 0);
  1130.         } catch (e) {
  1131.             if (e.name == "NS_ERROR_FILE_ACCESS_DENIED") {
  1132.                 mid_mud.util.localAlert("file.access.denied", "");
  1133.                 return false; 
  1134.             } else {
  1135.                 alert("fileManager.fileWriter: i/o error: " + e.name + "-" + e.message);   
  1136.                 return false;
  1137.             }
  1138.         } 
  1139.       
  1140.         var i, dictTab, dictId;
  1141.         for (i = 0; (dictTab = document.getElementsByTagName("tab").item(i)); i++) {
  1142.             dictId = dictTab.id.replace(/^tab/, "") + ";" + dictTab.label;
  1143.             fileStream.write(dictId + "\n", dictId.length + 1);
  1144.         }
  1145.     
  1146.         fileStream.close();
  1147.         return true;
  1148.     },
  1149.     
  1150.     fileReader : function (file, midlines) {
  1151.  
  1152.         var is =
  1153.         Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
  1154.   
  1155.         try {   
  1156.             is.init(file, 1, 444, false);  
  1157.         } catch (e) {
  1158.             if (e.name == "NS_ERROR_FILE_ACCESS_DENIED") { 
  1159.                 mid_mud.util.localAlert("file.access.denied", "");
  1160.             }
  1161.             else { 
  1162.                 alert("fileManager.fileReader: i/o error: " + e.name + "-" + e.message); 
  1163.             }
  1164.             return false;
  1165.         } 
  1166.  
  1167.         is.QueryInterface(Ci.nsILineInputStream);
  1168.         // read lines into array
  1169.         var midline = {}, hasmore;
  1170.  
  1171.         do {
  1172.             hasmore = is.readLine(midline);
  1173.             var dictId = midline.value.replace(/;.*$/, ""); 
  1174.             dictId = dictId.replace(/(.{37}).*/, "$1"); 
  1175.             midlines.push(dictId);
  1176.         } while (hasmore);
  1177.  
  1178.         is.close();
  1179.         return true;
  1180.     },
  1181.  
  1182.     saveSetAs : function () {  
  1183.     
  1184.         var nsIFilePicker = Ci.nsIFilePicker;
  1185.         var file;
  1186.     
  1187.         var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  1188.         fp.init(window, mid_mud.util.getLocaleString("choose.file"), nsIFilePicker.modeSave);
  1189.         fp.appendFilters(nsIFilePicker.filterAll);
  1190.     
  1191.         if (fp.show() == nsIFilePicker.returnCancel) {
  1192.             return false;
  1193.         }
  1194.         file = fp.file;
  1195.  
  1196.         if (!this.fileWriter(file)) {
  1197.             return false;
  1198.         }
  1199.    
  1200.         if (typeof(mid_mud.arrangeLUFPrefs) === "function") {
  1201.             mid_mud.arrangeLUFPrefs(file);
  1202.         }
  1203.     
  1204.         // mid_mud.util.localAlert("file.saved", "");
  1205.         mid_mud.changeDictionaryName(this.getDictionaryFilename());
  1206.     
  1207.     },
  1208.  
  1209.     
  1210.     saveNamedSet : function () {
  1211.  
  1212.         var file =  Components.classes["@mozilla.org/file/local;1"]
  1213.                          .createInstance(Components.interfaces.nsILocalFile);
  1214.         var savedFilesPrefs = midMyPrefS.getBranch("extensions.mid.lastusedsets.");
  1215.     
  1216.         if (savedFilesPrefs.prefHasUserValue(1)) {
  1217.             file = savedFilesPrefs.getComplexValue(1, Components.interfaces.nsILocalFile);
  1218.         }
  1219.         else { 
  1220.             return false;
  1221.         }
  1222.  
  1223.         if (!this.fileWriter(file)) {
  1224.             return false;
  1225.         }
  1226.         return true;
  1227.     },
  1228.  
  1229.     
  1230.     saveDefaultSet : function () {
  1231.         var file = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties)
  1232.              .get("ProfD", Components.interfaces.nsIFile); 
  1233.         file.append("mid_default.dis");
  1234.   
  1235.         if (!this.fileWriter(file)) {
  1236.             return false;
  1237.         }
  1238.         return true;
  1239.    
  1240.     },
  1241.     
  1242.         
  1243.     restoreSet : function (filePrefNum, filename) {
  1244.  
  1245.         mid_mud.saveDSet(); //**
  1246.     
  1247.         var def, fp, file, midlines = [];
  1248.  
  1249.         var nsIFilePicker = Ci.nsIFilePicker;
  1250.     
  1251.         if (typeof(filePrefNum) != 'number') {
  1252.             fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  1253.             fp.init(window, mid_mud.util.getLocaleString("choose.file"), nsIFilePicker.modeRead);
  1254.             fp.appendFilters(nsIFilePicker.filterAll);
  1255.             if (fp.show() == nsIFilePicker.returnCancel) {
  1256.                 return false;
  1257.             }
  1258.             file = fp.file;
  1259.             filename = "";
  1260.         } else {
  1261.             var savedFilesPrefs = midMyPrefS.getBranch("extensions.mid.lastusedsets.");
  1262.             if (!savedFilesPrefs.prefHasUserValue(filePrefNum)) {
  1263.                 mid_mud.util.localAlert("preference.not.found" , "extensions.mid.lastusedsets." + filePrefNum);
  1264.                 return false;
  1265.             }
  1266.             file = savedFilesPrefs.getComplexValue(filePrefNum, Ci.nsILocalFile);
  1267.             if (!file.exists()) {
  1268.                 mid_mud.util.localAlert("file.not.found", "");
  1269.                 return false;
  1270.             }
  1271.         }
  1272.         
  1273.         if (!this.fileReader(file, midlines)) {
  1274.             return false;
  1275.     };
  1276.  
  1277.         mid_mud.arrangeLUFPrefs(file);
  1278.     
  1279.         if (filename === "") {
  1280.             filename = this.getDictionaryFilename();
  1281.         }
  1282.  
  1283.         mid_mud.midFromRestore = true;   // not used
  1284.         mid_mud.changeDictionaryName(filename);
  1285.         mid_mud.loadDictionaries(midlines);
  1286.         return true;
  1287.     },
  1288.  
  1289.     restoreDefaultSet : function () {
  1290.  
  1291.         
  1292.         var midlines = [];
  1293.  
  1294.         if (mid_mud.dictionary != "default") {
  1295.             if (mid_mud.dictionary != "cancelled") {
  1296.                 mid_mud.saveDSet();
  1297.             }
  1298.         }
  1299.  
  1300.         mid_mud.changeDictionaryName("default");
  1301.  
  1302.         var file = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties)
  1303.          .get("ProfD", Components.interfaces.nsIFile); 
  1304.         file.append("mid_default.dis");
  1305.    
  1306.         if (!file.exists() || (file.fileSize == 0)) {
  1307.             mid_mud.changeDictionaryName("default");
  1308.             mid_mud.loadDictionaries();
  1309.             return false;
  1310.         }
  1311.  
  1312.         if (!this.fileReader(file, midlines)) {
  1313.             return false;
  1314.         };
  1315.  
  1316.  
  1317.         mid_mud.midFromRestore = true;   // not used
  1318.         mid_mud.changeDictionaryName("default");
  1319.         mid_mud.loadDictionaries(midlines);
  1320.         return true;
  1321.     },
  1322.  
  1323.     getDictionaryFilename : function () {
  1324.     
  1325.         var conv = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
  1326.                 createInstance(Ci.nsIScriptableUnicodeConverter);
  1327.         conv.charset = "UTF-8";
  1328.     
  1329.         var savedFilesPrefs = midMyPrefS.getBranch("extensions.mid.lastusedsets.");
  1330.         if (savedFilesPrefs.prefHasUserValue(1)) {
  1331.             return conv.ConvertToUnicode(savedFilesPrefs.getCharPref(1));
  1332.         }
  1333.         return "Unknown";
  1334.     
  1335.     }
  1336.         
  1337. };
  1338.  
  1339.  
  1340. mid_mud.lookup = {
  1341.  
  1342.     lookupAgain : function (event) {
  1343.     
  1344.         var word = mid_mud.transMemory.getWord(event);
  1345.         if (!word) { 
  1346.             return; // editing definition
  1347.         }
  1348.     
  1349.         domHelper.inputElement.value = word.getAttribute("label");
  1350.     
  1351.         mid_mud.saveInHistory = false;
  1352.         this.lookupWord(null);
  1353.         mid_mud.saveInHistory = true;
  1354.     
  1355.     },
  1356.     
  1357.  
  1358.     lookupFromContext : function () {
  1359.         domHelper.inputElement.value = this.getSelectionForLookup();
  1360.         this.lookupWord(null); 
  1361.     },
  1362.  
  1363.     getSelectionForLookup :  function () {
  1364.  
  1365.         var selection = null;
  1366.         var focusedWindow = document.commandDispatcher.focusedWindow;
  1367.         selection = focusedWindow.getSelection();
  1368.        
  1369.         if (!selection) {
  1370.             return selection;
  1371.         }
  1372.     
  1373.         if (document.popupNode) {
  1374.             var node = document.popupNode;
  1375.             var nodeLocalName = document.popupNode.localName.toUpperCase();
  1376.             if ((nodeLocalName == "TEXTAREA") ||
  1377.                (nodeLocalName == "INPUT" && node.type == "text")) {
  1378.                 selection = node.value.substring(node.selectionStart, node.selectionEnd);
  1379.             }
  1380.         }
  1381.         return selection;
  1382.     },
  1383.  
  1384.     convertLookupWord : function (b, w) {
  1385.     
  1386.         var chs = null, cw = "";
  1387.         var converter = Cc['@mozilla.org/intl/texttosuburi;1']
  1388.                        .createInstance(Ci.nsITextToSubURI);
  1389.    
  1390.         if (!(chs = b.xmlDic.getAttribute("inputencoding"))) {
  1391.            chs = b.contentDocument.characterSet;
  1392.         }
  1393.              
  1394.         try {
  1395.             cw = converter.ConvertAndEscape(chs, w);
  1396.         } catch (e) {
  1397.             cw = w;
  1398.         }
  1399.     
  1400.         return cw;
  1401.     
  1402.     },
  1403.  
  1404.     
  1405.     lookupWord : function (event) {
  1406.         
  1407.         if (event && event.originalTarget.nodeName == "treechildren") {
  1408.             return;
  1409.         }
  1410.  
  1411.         // lehet, hogy ez elΘg
  1412.         if (event && event.originalTarget.nodeName == 'command' &&
  1413.             document.commandDispatcher.focusedElement.id != "mid_searchWord") {
  1414.             return;
  1415.         }
  1416.     
  1417.         var i, url, smyWord, myBrowser;
  1418.         var myWord = domHelper.inputElement.value;
  1419.     
  1420.         myWord = myWord.replace(/['"+!%\\\/=\(\)\[\]\{\},\.\-?:_ <>]*$/g, "");
  1421.     
  1422.         if (myWord == "") { 
  1423.             return; 
  1424.         }
  1425.     
  1426.         domHelper.inputElement.value = myWord;
  1427.     
  1428.         for (i = 0; (myBrowser = document.getElementsByTagName("browser").item(i)); i++) {
  1429.             if (myBrowser.getAttribute("id") != "mid_MainBrowser") {
  1430.                 // myBrowser.markupDocumentViewer.fullZoom = 1.5; // temp
  1431.                 smyWord = this.convertLookupWord(myBrowser, myWord);
  1432.                 if (myBrowser.xmlDic.getAttribute("method") == "POST") {
  1433.                     if (myBrowser.xmlDic.getAttribute("engine_name")) {
  1434.                        this.postInternalEngine(myBrowser, smyWord ) ; // FF's search engine
  1435.                     } else {
  1436.                        this.postURI(myBrowser, smyWord);
  1437.                     }
  1438.                 } else {
  1439.                     if (myBrowser.xmlDic.getAttribute("method") == "func") {
  1440.                         searchfunction = myBrowser.xmlDic.getAttribute("function_name");
  1441.                         try {
  1442.                             mid_mud.dictSpecific[searchfunction](myBrowser, myWord);
  1443.                         } catch (e) { 
  1444.                             alert("Function error:" + searchfunction);
  1445.                         }
  1446.                     } else {
  1447.                         url = myBrowser.xmlDic.getAttribute("url");
  1448.                         if ( url != "" ) myBrowser.setAttribute("src", url.replace("XXX", smyWord));
  1449.                     } // normal
  1450.                 }
  1451.             } 
  1452.         }     
  1453.     
  1454.         domHelper.inputElement.focus();
  1455.         domHelper.inputElement.setSelectionRange(0, domHelper.inputElement.textLength);
  1456.     
  1457.         mid_mud.backCounter++;
  1458.  
  1459.         mid_mud.dictBrowsers.updateImages();
  1460.  
  1461.         if (mid_mud.transMemory.getLastWord() == myWord) {        // same as the last word
  1462.             return;                               
  1463.         }
  1464.         if (!mid_mud.saveInHistory) {
  1465.             return;
  1466.         }
  1467.         mid_mud.transMemory.saveWordToTree(myWord, "");
  1468.     
  1469.     },
  1470.     
  1471.     postURI : function (browser, word) {
  1472.     
  1473.         var dataString = browser.xmlDic.getAttribute("inputs").replace("XXX", word);
  1474.     
  1475.         var postData = Cc["@mozilla.org/network/mime-input-stream;1"].
  1476.                            createInstance(Ci.nsIMIMEInputStream);
  1477.     
  1478.         var stringStream = Cc["@mozilla.org/io/string-input-stream;1"].
  1479.                                createInstance(Ci.nsIStringInputStream);
  1480.     
  1481.         stringStream.setData(dataString, -1);
  1482.         postData.addHeader("Content-Type", "application/x-www-form-urlencoded");
  1483.         postData.addContentLength = true;
  1484.         postData.setData(stringStream);
  1485.     
  1486.         var url = browser.xmlDic.getAttribute("url");
  1487.     
  1488.         browser.webNavigation.loadURI(url,
  1489.                              browser.webNavigation.LOAD_FLAGS_NONE,
  1490.                              browser.currentURI ,
  1491.                              postData, null);
  1492.     
  1493.     },
  1494.     
  1495.     postInternalEngine : function  ( browser, word ) {
  1496.         var searchService = Components.classes["@mozilla.org/browser/search-service;1"].getService(Components.interfaces.nsIBrowserSearchService);
  1497.         var engine_name = browser.xmlDic.getAttribute("engine_name"); 
  1498.         var engine = searchService.getEngineByName(engine_name)
  1499.         if (!engine) {
  1500.             return 
  1501.         }
  1502.         var submission = engine.getSubmission(word, null);
  1503.         var postData = submission.postData;
  1504.         var url = browser.xmlDic.getAttribute("url");
  1505.         browser.webNavigation.loadURI(url,
  1506.                              browser.webNavigation.LOAD_FLAGS_NONE,
  1507.                              browser.currentURI ,
  1508.                              postData, null);
  1509.  
  1510.  
  1511.     }
  1512.         
  1513.         
  1514. };
  1515.  
  1516.  
  1517. mid_mud.mainBrowser = {
  1518.  
  1519.     popupShowing : function () {
  1520.  
  1521.         if (mid_mud.lookup.getSelectionForLookup() == '') {
  1522.             document.getElementById("mid_mainBCL").setAttribute("disabled", "true");
  1523.             document.getElementById("mid_mainBCC").setAttribute("disabled", "true");
  1524.         } else {
  1525.             document.getElementById("mid_mainBCL").setAttribute("disabled", "false");
  1526.             document.getElementById("mid_mainBCC").setAttribute("disabled", "false");
  1527.         }
  1528.     
  1529.         var mid_mb = domHelper.browserBrowser;
  1530.     
  1531.         if (mid_mb.canGoBack == false) {
  1532.             document.getElementById("mid_mainBCB").setAttribute("disabled", "true");
  1533.         } else {
  1534.             document.getElementById("mid_mainBCB").setAttribute("disabled", "false");
  1535.         }
  1536.     
  1537.         if (mid_mb.canGoForward == false){
  1538.             document.getElementById("mid_mainBCF").setAttribute("disabled", "true");
  1539.         } else {
  1540.             document.getElementById("mid_mainBCF").setAttribute("disabled", "false");
  1541.         }
  1542.     
  1543.     },
  1544.  
  1545.     goBack : function () {
  1546.         domHelper.browserBrowser.goBack();
  1547.     },
  1548.     
  1549.     goForward : function () { 
  1550.         domHelper.browserBrowser.goForward();
  1551.     },
  1552.     
  1553.     navigate : function () {
  1554.     
  1555.         var midUrl = document.getElementById("mid_Url").value;
  1556.         var regexp = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;
  1557.         var ar = regexp.exec(midUrl);
  1558.         if (!ar[1]) {
  1559.             midUrl = "http://" + midUrl;
  1560.         }
  1561.     
  1562. //        domHelper.browserBrowser.markupDocumentViewer.fullZoom = 1.5; // temp
  1563.         domHelper.browserBrowser.setAttribute("src", midUrl);
  1564.  
  1565.     
  1566.     }
  1567.         
  1568. };
  1569.  
  1570.  
  1571. mid_mud.dictBrowsers = {
  1572.     
  1573.     popupShowing : function (event) {
  1574.     
  1575.         if (mid_mud.lookup.getSelectionForLookup() == "") {
  1576.             document.getElementById("mid_BCL").setAttribute("disabled", "true");
  1577.             document.getElementById("mid_BCC").setAttribute("disabled", "true");
  1578.         } else {
  1579.             document.getElementById("mid_BCL").setAttribute("disabled", "false");
  1580.             document.getElementById("mid_BCC").setAttribute("disabled", "false");
  1581.         }
  1582.     
  1583.         var myTabPanel = domHelper.tabpanelsElement;
  1584.     
  1585.         if (myTabPanel.selectedPanel.canGoBack === false) {
  1586.             document.getElementById("mid_BCB").setAttribute("disabled", "true");
  1587.         } else {
  1588.             document.getElementById("mid_BCB").setAttribute("disabled", "false");
  1589.         }
  1590.     
  1591.         if (myTabPanel.selectedPanel.canGoForward === false) {
  1592.             document.getElementById("mid_BCF").setAttribute("disabled", "true");
  1593.         } else {
  1594.             document.getElementById("mid_BCF").setAttribute("disabled", "false");
  1595.         }
  1596.     
  1597.     },
  1598.  
  1599.     allBrowsersStop : function () {
  1600.         var myBrowser;
  1601.         const nsIWebNavigation = Ci.nsIWebNavigation;
  1602.         const flags = nsIWebNavigation.STOP_ALL;
  1603.  
  1604.         for (i = 0; (myBrowser = document.getElementsByTagName("browser").item(i)); i++) {
  1605.             try {
  1606.                 if (myBrowser.getAttribute("id") != "mid_MainBrowser") {
  1607.                     myBrowser.webNavigation.stop(flags);
  1608.                 }
  1609.             } catch (e) {
  1610.                 alert(myBrowser.getAttribute("homepage"));
  1611.             }
  1612.         }
  1613.     
  1614.     },
  1615.     
  1616.     updateImages : function () {
  1617.         var b = document.getElementById("back_image");
  1618.         var f = document.getElementById("for_image");
  1619.         if (mid_mud.forwardCounter < 1) {
  1620.             f.setAttribute("canwalk", "false");
  1621.         }
  1622.         else {
  1623.             f.setAttribute("canwalk", "true");
  1624.         }
  1625.         if (mid_mud.backCounter < 0) {
  1626.             b.setAttribute("canwalk", "false");
  1627.         } else { 
  1628.             b.setAttribute("canwalk", "true");
  1629.         }
  1630.     },
  1631.          
  1632.     thisBrowserBack : function () {
  1633.         domHelper.tabpanelsElement.selectedPanel.goBack();  
  1634.     
  1635.     },
  1636.     
  1637.     thisBrowserForward : function () {
  1638.         domHelper.tabpanelsElement.selectedPanel.goForward();  
  1639.     },
  1640.     
  1641.     allForward : function () {
  1642.     
  1643.         var myBrowser, word, i;
  1644.       
  1645.         if (mid_mud.forwardCounter < 0) {
  1646.             return false;
  1647.         }
  1648.     
  1649.         for (i = 0; (myBrowser = document.getElementsByTagName("browser").item(i)); i++) {
  1650.             if (myBrowser.getAttribute("id") == "mid_MainBrowser") {
  1651.                 continue;
  1652.             }
  1653.             if (myBrowser.xmlDic.getAttribute("method") == "POST") {
  1654.                 word = document.getElementsByTagName("treecell").item((mid_mud.backCounter + 1) * 2);
  1655.                 mid_mud.lookup.postURI(myBrowser, 
  1656.                                mid_mud.lookup.convertLookupWord(myBrowser,
  1657.                                word.getAttribute("label")));
  1658.                     
  1659.             } else {
  1660.                 if (myBrowser.webNavigation.canGoForward) {
  1661.                     myBrowser.webNavigation.goForward();
  1662.                 }
  1663.             }
  1664.         }
  1665.         mid_mud.backCounter++;
  1666.         mid_mud.forwardCounter--;
  1667.         mid_mud.dictBrowsers.updateImages();
  1668.     
  1669.     },
  1670.  
  1671.     allBack : function () {
  1672.  
  1673.         var myBrowser, word, i;
  1674.     
  1675.         if ( mid_mud.backCounter < -1 ) {
  1676.           return false;
  1677.         }
  1678.  
  1679.         for (i = 0; (myBrowser = document.getElementsByTagName("browser").item(i)); i++) {
  1680.             if (myBrowser.getAttribute("id") == "mid_MainBrowser") {
  1681.                 continue;
  1682.             }
  1683.             if ((myBrowser.xmlDic.getAttribute("method") == "POST") && (mid_mud.backCounter!=0)) {
  1684.                 word = document.getElementsByTagName("treecell").item((mid_mud.backCounter + 1) * 2);
  1685.                 mid_mud.lookup.postURI(myBrowser,
  1686.                                mid_mud.lookup.convertLookupWord(myBrowser,
  1687.                                word.getAttribute("label")));
  1688.  
  1689.             } else {
  1690.                 if (myBrowser.webNavigation.canGoBack) {
  1691.                     myBrowser.webNavigation.goBack();
  1692.                 }
  1693.             }
  1694.         }
  1695.         mid_mud.forwardCounter++;
  1696.         mid_mud.backCounter--;
  1697.         mid_mud.dictBrowsers.updateImages();
  1698.     
  1699.     }
  1700.     
  1701. };
  1702.  
  1703.           
  1704. mid_mud.finder = {
  1705.  
  1706.     positionToFirstHit : function (doc)  {
  1707.     
  1708.         var keres = domHelper.inputElement.value;
  1709.         var cw = doc.body.clientWidth / 2;
  1710.         var reps = new RegExp(keres, 'gi');
  1711.         var s  = doc.body.innerHTML.replace(reps, '<midtag>' + keres + '</midtag>');
  1712.         doc.body.innerHTML = s;
  1713.         var a = [];
  1714.         a = doc.getElementsByTagName("midtag");
  1715.         for (var i = 0; i < a.length; i++ ) {  
  1716.             var e = a[i];
  1717.             var r = e.getBoundingClientRect();
  1718.             if (r.left > cw) {
  1719.                  j = i; 
  1720.             } else {
  1721.                break;
  1722.             }
  1723.         }
  1724.         if (e) {
  1725.             e.setAttribute("style","background-color :  yellow;");
  1726.             doc.defaultView.scroll(1, r.top - 10);
  1727.         }
  1728.     },
  1729.     
  1730.  
  1731.     findNext : function (b) {
  1732.         var  findInst;
  1733.         if (!b || !domHelper.inputElement.value) {
  1734.             return null;
  1735.         }
  1736.         b.contentWindow.focus();
  1737.         findInst               = b.webBrowserFind;
  1738.         findInst.searchString  = domHelper.inputElement.value;
  1739.         findInst.matchCase     = false;
  1740.         findInst.wrapFind      = true;
  1741.         findInst.findBackwards = false;
  1742.         findInst.entireWord    = false;
  1743.         findInst.searchFrames  = true;
  1744.  
  1745.         try {
  1746.             findInst.findNext();
  1747.         } catch (e) {};
  1748.     },
  1749.     
  1750.     findStringOnPage : function () {
  1751.     
  1752.         var keres = domHelper.inputElement.value;
  1753.         if (keres == "") {
  1754.             return;
  1755.         }
  1756.     
  1757.         if (document.commandDispatcher.focusedWindow &&
  1758.                (domHelper.browserBrowser.currentURI.spec == 
  1759.                 document.commandDispatcher.focusedWindow.location)) {
  1760.         this.findNext(domHelper.browserBrowser);
  1761.             return;
  1762.         }
  1763.     
  1764.         if (domHelper.tabboxElement.selectedIndex > -1) {
  1765.             var win = domHelper.tabboxElement.selectedPanel.contentWindow;
  1766.             this.findNext(domHelper.tabboxElement.selectedPanel);
  1767.         }
  1768.     },
  1769.  
  1770.     findInPage : function () {
  1771.         if (domHelper.tabboxElement.selectedIndex > -1) {
  1772.         this.findNext(domHelper.tabboxElement.selectedPanel);
  1773.         var sel = document.commandDispatcher.focusedWindow.getSelection(); // bad hack, not an input box
  1774.         if (sel == "")
  1775.         this.findNext(domHelper.tabboxElement.selectedPanel); // hope it is not an input field
  1776.         }
  1777.     },
  1778.     
  1779.     findInNextPage : function (searchFlag) { // simplify me, we have no collapsed browsers yet 
  1780.         var tabbox = domHelper.tabboxElement;
  1781.         var t = domHelper.tabboxElement.selectedPanel;
  1782.         if (domHelper.tabboxElement.selectedIndex > -1) {
  1783.             if (!t.nextSibling) {   
  1784.                 tabbox.selectedIndex = 0;
  1785.             } else {
  1786.                 tabbox.selectedIndex++;
  1787.             }
  1788.             if (false) { // searchFlag
  1789.                 t = domHelper.tabboxElement.selectedPanel;
  1790.                 if (!t.contentDocument.midTainted) { 
  1791.                     this.positionToFirstHit(t.contentDocument);
  1792.                 }
  1793.                 t.contentDocument.midTainted=true;
  1794.             }
  1795.         }
  1796.     },
  1797.  
  1798.     findInPrevPage : function (searchFlag) {
  1799.  
  1800.         var tabbox = domHelper.tabboxElement;
  1801.         var t = domHelper.tabboxElement.selectedPanel;
  1802.         if (domHelper.tabboxElement.selectedIndex > -1) {
  1803.             if (!t.previousSibling) { 
  1804.                 tabbox.selectedIndex = domHelper.tabpanelsElement.childNodes.length - 1;
  1805.             } else {
  1806.                 tabbox.selectedIndex--;
  1807.             }
  1808.             if (false) { // searchFlag ** experimental, not in prod. release **
  1809.                 t = domHelper.tabboxElement.selectedPanel;
  1810.                 if (!t.contentDocument.midTainted) { 
  1811.                     this.positionToFirstHit(t.contentDocument);
  1812.                 }
  1813.                 t.contentDocument.midTainted=true;
  1814.             }
  1815.         }
  1816.     }
  1817.         
  1818. };     
  1819.  
  1820.  
  1821. mid_mud.dictSpecific = {
  1822.  
  1823.     cambFrEn : function (browser, word) {
  1824.     
  1825.         word = word.toLowerCase();
  1826.         word = mid_mud.util.stripAccents(word);
  1827.         var url = browser.xmlDic.getAttribute("url");
  1828.         browser.setAttribute("src", url.replace("XXX", word));
  1829.     
  1830.     },
  1831.     
  1832.     onetRuPl : function (browser, word) {
  1833.     
  1834.         word    = mid_mud.util.toUniNumber(word);
  1835.         var url = browser.xmlDic.getAttribute("url");
  1836.         browser.setAttribute("src", url.replace("XXX", word));
  1837.     
  1838.     },
  1839.  
  1840.     oroszmagyar : function (browser, word) {              //  not used...later?
  1841.         browser.contentDocument.getElementById("word").setAttribute("value", word);
  1842.         browser.contentWindow[Dictionary][search]();
  1843.     }
  1844.  
  1845. };
  1846.  
  1847.  
  1848.  
  1849. mid_mud.transMemory = {
  1850.     
  1851.     popupShowing : function (event) {
  1852.     
  1853.         midRowCounter = -1; // global
  1854.         var row = {}, col = {}, child = {};
  1855.         var target = document.popupNode;
  1856.         if (target.localName == "treechildren") {
  1857.             var tree  = document.getElementById("mid_wordstree");
  1858.             tree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, child);
  1859.             midRowCounter = row.value;
  1860.         }
  1861.         document.getElementById('mid_treecontextpopup').setAttribute("collapsed", "false");
  1862.         if (midRowCounter < 0) {
  1863.             document.getElementById('mid_treecontextpopup').setAttribute("collapsed", "true");
  1864.         }
  1865.     },
  1866.     
  1867.     getTreeRow : function (event) {
  1868.  
  1869.         midRowCounter = -1;  // global
  1870.         var row = {}, col = {}, child = {};
  1871.         var target;
  1872.         if (event.detail == 2) {
  1873.             target = event.originalTarget;
  1874.         } else {
  1875.             target = document.popupNode;
  1876.         }
  1877.         if (target.localName == "treechildren")
  1878.         {
  1879.             var tree = document.getElementById("mid_wordstree");
  1880.             tree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, child);
  1881.             midRowCounter = row.value;
  1882.         }   
  1883.         return midRowCounter;
  1884.     },
  1885.     
  1886.     wordsTreeLookup : function (event) {
  1887.         
  1888.         var word = document.getElementsByTagName("treecell").item(midRowCounter * 2);
  1889.     
  1890.         domHelper.inputElement.value = word.getAttribute("label");
  1891.         mid_mud.saveInHistory = false;
  1892.         mid_mud.lookup.lookupWord();
  1893.     
  1894.         mid_mud.saveInHistory = true;
  1895.     
  1896.     },
  1897.     
  1898.     fillDefinition : function (event) {
  1899.     
  1900.          // midRowCounter is known from popupshowing
  1901.          var def = document.getElementsByTagName("treecell").item(midRowCounter * 2 + 1);
  1902.     
  1903.          var defstrbundle = document.getElementById("tree.definition");
  1904.          var definition   = defstrbundle.getString("tree.definition");
  1905.     
  1906.          def.setAttribute("label", prompt(definition, def.getAttribute("label")));
  1907.     
  1908.     },
  1909.     
  1910.     removeRow : function (event) {
  1911.         var parent, cell, tree ;
  1912.         tree = document.getElementById("mid_wordstree");
  1913.         cell = document.getElementsByTagName("treecell").item(midRowCounter * 2 + 1);
  1914.         cell.parentNode.removeChild(cell);
  1915.         cell = document.getElementsByTagName("treecell").item(midRowCounter * 2);
  1916.         cell = document.getElementsByTagName("treerow").item(midRowCounter);
  1917.         parent = cell.parentNode;
  1918.         parent.removeChild(cell);
  1919.         parent.parentNode.removeChild(parent);
  1920.         mid_mud.updateStatusBarCounter();
  1921.     },
  1922.     
  1923.     saveWordToTree : function (myWord, myDef) {
  1924.     
  1925.         var wordsTreeChildren = document.getElementById("mid_wordstreechildren");
  1926.         var wordsTree         = document.getElementById("mid_wordstree");
  1927.         var wordsTreeRow      = wordsTree.view.rowCount;
  1928.     
  1929.         var newTreeItem = document.createElement("treeitem");
  1930.         var newTreeRow  = document.createElement("treerow");
  1931.         var newWord     = document.createElement("treecell");
  1932.         var newDef      = document.createElement("treecell");
  1933.     
  1934.         newWord.setAttribute("label", myWord);
  1935.         newWord.setAttribute("editable", "false");
  1936.         newTreeRow.appendChild(newWord);
  1937.         newDef.setAttribute("label", myDef);
  1938.         newTreeRow.appendChild(newDef);
  1939.     
  1940.         newTreeItem.appendChild(newTreeRow);
  1941.         wordsTreeChildren.appendChild(newTreeItem);
  1942.     
  1943.         wordsTree.treeBoxObject.ensureRowIsVisible(wordsTreeRow);
  1944.         mid_mud.updateStatusBarCounter();
  1945.     },
  1946.      
  1947.     getWord : function (event) {
  1948.     
  1949.         var tree = document.getElementById("mid_wordstree");
  1950.         var tbo  = tree.treeBoxObject;
  1951.         var row  = {}, col = {}, child = {};
  1952.  
  1953.         tbo.getCellAt(event.clientX, event.clientY, row, col, child);
  1954.     
  1955.         if (col.value.id != "mid_words") {
  1956.             return null; // editing definition
  1957.         }
  1958.         return document.getElementsByTagName("treecell").item(this.getTreeRow(event) * 2);
  1959.     },
  1960.     
  1961.     getLastWord : function () {
  1962.         var lastWord = "";
  1963.         var tree = document.getElementById("mid_wordstree");
  1964.         var rowCounter = tree.view.rowCount;
  1965.         if (rowCounter > 0) {
  1966.             var col = tree.columns ? tree.columns.mid_words : "mid_words";
  1967.             try {
  1968.                 lastWord = tree.view.getCellText(rowCounter - 1, col);
  1969.             } catch (e) { 
  1970.                 alert( "getLastWord: " + e.name + "-" + e.message);
  1971.             }
  1972.         }
  1973.         return lastWord;
  1974.     },
  1975.  
  1976.     removeAllRows : function (event) {
  1977.         var treeChildren = document.getElementById("mid_wordstreechildren");
  1978.         while (treeChildren.hasChildNodes()) {
  1979.             treeChildren.removeChild(treeChildren.firstChild);
  1980.         }
  1981.         mid_mud.updateStatusBarCounter();
  1982.     },
  1983.     
  1984.     getRowCount : function () {
  1985.         return document.getElementById("mid_wordstree").view.rowCount;
  1986.     },
  1987.     
  1988.     saveWordsToFile : function () {
  1989.     
  1990.         var conv = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
  1991.                   createInstance(Ci.nsIScriptableUnicodeConverter);
  1992.         conv.charset = "UTF-8";
  1993.     
  1994.         var nsIFilePicker = Ci.nsIFilePicker;
  1995.         var file = null, fileStream = null;
  1996.     
  1997.         var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  1998.         fp.init(window, mid_mud.util.getLocaleString("choose.file"), nsIFilePicker.modeSave);
  1999.         fp.appendFilters(nsIFilePicker.filterAll);
  2000.         if (fp.show() == nsIFilePicker.returnCancel) {
  2001.             return false;
  2002.         }
  2003.         file = fp.file;
  2004.     
  2005.         fileStream = Cc["@mozilla.org/network/file-output-stream;1"].
  2006.                      createInstance(Ci.nsIFileOutputStream);
  2007.         try {
  2008.             fileStream.init(file, 0x04 | 0x08 | 0x20, 420, 0);
  2009.         } catch (e) {
  2010.             if (e.name == "NS_ERROR_FILE_ACCESS_DENIED") {  
  2011.                 mid_mud.util.localAlert("file.access.denied", "");
  2012.             }
  2013.             else {
  2014.                 alert("i/o error: " + e.name + "-" + e.message);
  2015.             }
  2016.         }
  2017.         var i, cell_1, cell_2, word, def;
  2018.         var tree = document.getElementById("mid_wordstree");
  2019.  
  2020.         for (i = 0; (cell_1 = tree.getElementsByTagName("treecell").item(i)); i = i + 2) {
  2021.             word = cell_1.getAttribute("label");
  2022.             cell_2   = document.getElementsByTagName("treecell").item(i + 1);
  2023.             def  = cell_2.getAttribute("label");
  2024.             data = conv.ConvertFromUnicode(word + ";" + def + "\n");
  2025.             fileStream.write(data, data.length);
  2026.         }
  2027.         fileStream.close();
  2028.         mid_mud.util.localAlert("file.saved", "");
  2029.     },
  2030.           
  2031.     readWordsFromFile : function () {
  2032.  
  2033.         var conv = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
  2034.                     createInstance(Ci.nsIScriptableUnicodeConverter);
  2035.         conv.charset = "UTF-8";
  2036.     
  2037.         var nsIFilePicker = Ci.nsIFilePicker;
  2038.         var file = null, sorstr = "", sor = [];
  2039.     
  2040.         var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  2041.         fp.init(window, mid_mud.util.getLocaleString("choose.file"), nsIFilePicker.modOpen);
  2042.         fp.appendFilters(nsIFilePicker.filterAll);
  2043.         if (fp.show() == nsIFilePicker.returnCancel) {
  2044.             return false;
  2045.         }
  2046.         file = fp.file;
  2047.     
  2048.     
  2049.         var istream = Cc["@mozilla.org/network/file-input-stream;1"]
  2050.                     .createInstance(Ci.nsIFileInputStream);
  2051.         try {
  2052.             istream.init(file, 0x01, 444, 0);
  2053.         } catch (e) {
  2054.             if (e.name == "NS_ERROR_FILE_ACCESS_DENIED") {
  2055.                 mid_mud.util.localAlert("file.access.denied", "");
  2056.             }
  2057.             else {
  2058.                 alert("i/o error: " + e.name + "-" + e.message);
  2059.             }
  2060.         }
  2061.         istream.QueryInterface(Ci.nsILineInputStream);
  2062.     
  2063.         /* read lines into array */
  2064.         var line = {}, lines = [], hasmore;
  2065.         do {
  2066.             hasmore = istream.readLine(line);
  2067.             sorstr  = conv.ConvertToUnicode(line.value);
  2068.             sor[0]  = "";
  2069.             sor[1]  = "";
  2070.             sor     = sorstr.split(";");
  2071.             this.saveWordToTree(sor[0], sor[1]);
  2072.             lines.push(line.value);
  2073.         } while (hasmore);
  2074.     
  2075.         istream.close();
  2076.     }
  2077.      
  2078. };
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085. mid_mud.util = {
  2086.     prompts : Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService),
  2087.  
  2088.     confirm : function (what) {
  2089.           return this.prompts.confirm(window, "mid", what);
  2090.     },     
  2091.  
  2092.     stripAccents : function (str) {
  2093.     
  2094.         var s = str, i;
  2095.     
  2096.         var rExps = [ /[\xC0-\xC2]/g, /[\xE0-\xE2]/g,
  2097.                  /[\xC8-\xCA]/g, /[\xE8-\xEB]/g,
  2098.                  /[\xCC-\xCE]/g, /[\xEC-\xEE]/g,
  2099.                  /[\xD2-\xD4]/g, /[\xF2-\xF4]/g,
  2100.                  /[\xD9-\xDB]/g, /[\xF9-\xFB]/g,
  2101.                  /[\xC7]/g, /[\xE7]/g];
  2102.     
  2103.         var repChar = ['A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u', 'C', 'c'];
  2104.     
  2105.         for (i = 0; i < rExps.length; i++) {
  2106.             s = s.replace(rExps[i], repChar[i]);
  2107.         }
  2108.         return s;
  2109.     },
  2110.     
  2111.     toUniNumber : function (s) {
  2112.     
  2113.         var c, m, o = "", i = s;
  2114.     
  2115.         for (m = 0; i.charAt(m); ++m) {
  2116.             if (((c = i.charCodeAt(m)) < 128 && c != 38) ||
  2117.                (c >= 160 && c <= 255 &&
  2118.                 c != 166 &&
  2119.                 c != 173 && c != 178 && c != 179 &&
  2120.                 c != 185 && c != 188 && c != 189 &&
  2121.                 c != 190 &&
  2122.                 c != 208 &&
  2123.                 c != 215 &&
  2124.                 c != 221 && c != 222 &&
  2125.                 c != 240 &&
  2126.                 c != 253 && c != 254)) {
  2127.                 o = o + i.charAt(m);
  2128.             } else {
  2129.                 if (c == 38) {
  2130.                     o = o + "&";
  2131.                 }
  2132.                 else {
  2133.                     o = o + "&#" + c + ";";
  2134.                 }
  2135.             }
  2136.         }
  2137.         return escape(o);
  2138.     },
  2139.     
  2140.     populateWithAttributes : function (domObj) {
  2141.         var len = arguments.length;
  2142.         while (len > 2) {
  2143.             domObj.setAttribute(arguments[len - 2], arguments[len - 1]);
  2144.             len = len - 2;
  2145.         }
  2146.     },
  2147.  
  2148.     inArray : function (arr, val) {
  2149.         var i;
  2150.         if (!arr) {
  2151.             return false;
  2152.         }
  2153.     
  2154.         for (i = 0; i < arr.length; i++) {
  2155.             if (arr[i] === val) {
  2156.                 return true;
  2157.             }
  2158.         }
  2159.         return false;
  2160.     },
  2161.  
  2162.     browserWrapper: function (a) {
  2163.  
  2164.         var browserName = "";
  2165.  
  2166.         try {
  2167.             var appInfo = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
  2168.         } catch (e) {}
  2169.  
  2170.         if (appInfo) {
  2171.             browserName = appInfo.name;
  2172.         }
  2173.         switch (browserName) {
  2174.         case "Iceweasel":
  2175.             a.Iceweasel();
  2176.             break;
  2177.         case "Firefox":
  2178.             a.Firefox();
  2179.             break;
  2180.         case "Browser":        // Flock now
  2181.             a.Flock(); 
  2182.             break;
  2183.         case "Flock":          // Flock later?
  2184.             a.Flock();
  2185.             break;       
  2186.         case "Netscape":
  2187.             a.Netscape();
  2188.             break;
  2189.         case "SeaMonkey":
  2190.             a.SeaMonkey();
  2191.             break;
  2192.         case "mid":          // Xulrunner mid
  2193.             a.mid();
  2194.             break; 
  2195.         default:
  2196.             alert("Sorry, unknown or old browser");
  2197.         }
  2198.     },
  2199.  
  2200.     dumpToConsole: function (aMessage) {
  2201.  
  2202.         var consoleService = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService);
  2203.         consoleService.logStringMessage("mid_ " + aMessage);
  2204.     },
  2205.  
  2206.     getLocaleString : function  (lsName) {
  2207.     
  2208.         var  myprop =
  2209.             Cc["@mozilla.org/intl/stringbundle;1"].getService(Ci.nsIStringBundleService);
  2210.     
  2211.         var mystrings = myprop.createBundle("chrome://mid/locale/mid.properties");
  2212.         return  mystrings.GetStringFromName(lsName);
  2213.     
  2214.     },
  2215.  
  2216.     localAlert : function (p,q) {
  2217.         var msbd = document.getElementById(p);
  2218.         var ls = msbd.getString(p);
  2219.         this.prompts.alert(window, "mid", ls + q);
  2220.     },
  2221.  
  2222.     copyText : function () {
  2223.         const gClipboardHelper =
  2224.         Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
  2225.         gClipboardHelper.copyString(mid_mud.lookup.getSelectionForLookup());
  2226.     }
  2227.  
  2228.     
  2229. };
  2230.